import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 26727
 * Date: 2024-01-10
 * Time: 14:53
 */

public class MyArrayList {
    public int[] elem;
    public int usedSize; //存储数据的个数
    public static final int DE_SIZE = 10;

    public MyArrayList() {
    this.elem = new int[DE_SIZE];
    }

    // 打印顺序表，注意：该方法并不是顺序表中的方法，为方便看测试结果给出
    public void display() {
        for(int i = 0; i < usedSize; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }

    // 获取顺序表长度
    public int size() {
        return this.usedSize;
    }
    // 判定是否包含某个元素
    public boolean contains(int toFind) {
    for(int i = 0; i < usedSize; i++) {
        if(this.elem[i] == toFind) {
            return true;
        }
    }
    return false;
    }

    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
    for(int i = 0; i < usedSize; i++) {
        if(this.elem[i] == toFind) {
            return i;
        }
    }
    return -1; //数组中没有下标为负数的
    }

    // 新增元素,默认在数组最后新增
    public void add(int data) {
      if(isFull()) {
          resize();
      }
      this.elem[this.usedSize] = data;
      this.usedSize++;
    }
    /**
     * 扩容
     */
    private void resize() {
        this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
    }

    /**
     * 判断是否为满
     */
    public boolean isFull() {
        return this.usedSize== this.elem.length;
    }

    // 在 pos 位置新增元素 O(N)
    public void add(int pos, int data) {
        checkIndex(pos);
        if(isFull()) {
            resize();
        }
        for(int i = this.usedSize - 1 ; i >= pos;i--) {
            this.elem[i+1] = this.elem[i];
            this.usedSize++;
        }
    }

    /**
     * 检查add数据的时，pos是否合法
     */
    private void checkIndex(int pos) {
           if(pos <  0 || pos > this.usedSize) {
               throw new IndexOutOfException
                       ("位置不合法，请检查位置合理性");
           }
    }

    // 获取 pos 位置的元素
    public int get(int pos) {
        checkGetIndex(pos);
        return this.elem[pos];
    }

    private void checkGetIndex(int pos) {
        if(pos <  0 || pos >= this.usedSize) {
            throw new IndexOutOfException
                    ("get位置不合法，请检查位置合理性");
        }
    }
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        checkIndex(pos);
        this.elem[pos] = value;
    }

    //删除第一次出现的关键字key O(n)
    public boolean remove(int toRemove) {
        int index  = indexOf(toRemove);
        if(index == -1) {
            System.out.println("没有这个数据！");
            return  false;
        }
     for(int i = index; i < this.usedSize-1;i++) {
         this.elem[i] = this.elem[i+1];
     }
        this.usedSize--;
        //elem[usedSize] = null;
        // 如果里面是引用类型 那么此时就需要手动置空
        elem[usedSize] = 0;
        //能考虑到的，我们需要尽量去考虑，不能仅仅依靠代码
        return true;
    }

    // 清空顺序表
    public void clear() {
        usedSize = 0; //usedSize = 0则就置空了不用想得很复杂
    }
}
